
// 定义泛型类时在类名之后使用<T>形式来定义类型参数
class Wrapper<T> {
    // 为属性标注类型为T类型
    value: T;
    // 将构造函数的参数类型标注为T类型
    constructor( value: T ) {
        this.value = value ;
    }
    // 将方法的返回类型标注为T类型
    valueOf(): T {
        return this.value ;
    }
}

// 创建泛型类的实例时在构造函数和参数之间使用<number>形式指定类型参数
let nw = new Wrapper<number>( 9527 );
console.log( nw , typeof nw );
console.log( nw.valueOf() , typeof nw.valueOf() );

let sw = new Wrapper<string>( '过年后怎么那么瞌睡' );
console.log( sw , typeof sw );
console.log( sw.valueOf() , typeof nw.valueOf() );

let bw = new Wrapper<boolean>( true );
console.log( bw );

let iw = new Wrapper<bigint>( 100n );
console.log( iw );

// let aw = new Wrapper( Symbol( '2022' ) );
let aw = new Wrapper<any>( Symbol( '2022' ) );
console.log( aw );

let ow = new Wrapper<Object>( { id: 2022 , name: '虎年' } );
console.log( ow );

let fw = new Wrapper<Function>( ()=> { } );
console.log( fw );
